package com.itheima.health.common;

import com.itheima.health.service.SetMealService;
import com.itheima.health.util.QiniuUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Set;

@Component
@Slf4j
public class SetmealPicClean {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private QiniuUtils qiniuUtils;
    @Autowired
    private SetMealService setMealService;


    @Scheduled(cron = "* * 2 * * ?")//半夜两点执行清理垃圾图片的定时任务
    public void SetmealPicsClean(){
        BoundSetOperations boundSetOperations = redisTemplate.boundSetOps(RedisConst.SETMEAL_PIC_RESOURCES);
        //1 获取redis中所有的套餐图片名称的set集合 => 就是所有的垃圾图片
        Set<String> set = boundSetOperations.members();
        //2 遍历集合, 从redis 及 七牛云中 删除所有的垃圾图片
        // => 为避免删除 清理时 误清理了此时已上传但不确定是否会保存到数据库的图片, 图片的创建时间 比 清理时间点 早30分钟
        for (String pic : set) {
            //3 截取redis中图片名称中的图片创建时间的毫秒值
            Long createTime = Long.valueOf(pic.split("_")[0]);
            //4 获取删除时间点的毫秒值
            long currentTimeMillis = System.currentTimeMillis();
            //5 判断 如果图片创建时间的毫秒值 与 删除时间点的毫秒值 的差小于30分钟 ( 1800000 ), 则本次清理不删除该图片
            if ((currentTimeMillis - createTime) < 1800000){
                log.info("该图片的创建时间 小于 清理前的30分钟, 本次不予删除: {}",pic);
                continue;
            }
            //6 应保证redis中的套餐图片名称 在 数据库中不存在 => 判断 如果该图片名称在数据库中存在,则将此图片名称 从redis中删除,但不从七牛云中删除
            Integer count = setMealService.findByPic(pic);
            if (count > 0){
                log.info("该图片不是垃圾图片,不需要删除: {}",pic);
                boundSetOperations.remove(pic);
                continue;
            }
            //7 如果 图片创建时间的毫秒值 与 删除时间点的毫秒值 的差大于30分钟,且数据库中没有该图片, 则将此图片从redis及七牛云中都删除
            qiniuUtils.deleteFileFromQiniu(pic);
            boundSetOperations.remove(pic);
        }
        log.info("垃圾图片清理结束");
    }
}
